package com.exam.config;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class CorsConfig implements WebMvcConfigurer {

    /**
     * 重写addCorsMappings方法，添加跨域配置
     *
     * @param registry CorsRegistry对象，用于添加跨域配置
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 添加跨域映射
        registry.addMapping("/**")
                // 允许所有来源
                .allowedOrigins("*")
                // 允许的方法
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                // 允许携带凭证
                .allowCredentials(true)
                // 预检有效期为3600秒
                .maxAge(3600)
                // 允许的头部信息
                .allowedHeaders("*");
    }

    /**
     * 注册CORS过滤器，允许跨域访问。
     *
     * @return 注册好的CORS过滤器FilterRegistrationBean对象
     */
    // 让cors高于拦截器的权限
    @Bean
    public FilterRegistrationBean<CorsFilter> corsFilter() {
        // 创建一个CorsConfiguration对象，用于配置CORS相关参数
        CorsConfiguration config = new CorsConfiguration();
        // 允许携带凭证（cookies等）
        config.setAllowCredentials(true);
        // 允许所有来源进行跨域访问
        config.addAllowedOrigin("*");
        // 允许所有请求方法
        config.addAllowedMethod("*");
        // 允许所有请求头
        config.addAllowedHeader("*");

        // 创建一个UrlBasedCorsConfigurationSource对象，用于根据URL路径匹配CORS配置
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        // 注册一个全局的CORS配置，对所有路径生效
        configSource.registerCorsConfiguration("/**", config);

        // 创建一个FilterRegistrationBean对象，用于注册CorsFilter
        FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(configSource));

        // 设置CorsFilter的优先级为最高，确保在Spring Security的Filter之前执行
        // 设置优先级 高于任何filter 此处防止spring security的filter在cros filter之前执行
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);

        return bean;
    }
}
